home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Utilities / StartupSelector / Source / StartupSelector.e next >
Encoding:
Text File  |  1997-09-11  |  23.4 KB  |  794 lines

  1. /*     Startup  Selector        */
  2. /*   by OLIVERES Jean-Marc      */
  3. /*      GUENOT   Raphaël        */
  4. /* (c) 1996-97 Moonchild  Prod. */
  5. /*          11.09.97            */
  6.  
  7. OPT REG=3
  8. OPT OSVERSION=37
  9. OPT PREPROCESS
  10.  
  11. #define DATE '11.09.97'
  12. #define VERS '2.1'
  13.  
  14. MODULE 'dos/dos','dos/dostags','dos/dosasl','dos/notify'
  15. MODULE 'locale','libraries/locale'
  16. MODULE 'intuition/intuition','intuition/screens'
  17. MODULE 'gadtools','libraries/gadtools'
  18. MODULE 'reqtools','libraries/reqtools'
  19. MODULE 'exec/nodes','exec/lists','exec/ports','amigalib/lists'
  20. MODULE 'utility/hooks','tools/installhook'
  21. MODULE 'devices/inputevent','icon','workbench/workbench'
  22. MODULE 'graphics/text','diskfont','libraries/diskfont',
  23.              'graphics/gfx','graphics/rastport','graphics/gfxmacros'
  24. MODULE 'raphe/checkqualifier','raphe/asciifp','raphe/freezewindow',
  25.              'raphe/sfx','raphe/directorylist'
  26.  
  27. OBJECT lvitem OF mln
  28.     icon:INT
  29.     name:PTR TO CHAR
  30. ENDOBJECT
  31.  
  32. ENUM ER_NONE,ER_WIN,ER_DIR,ER_NODIR,ER_SCR,ER_MOUSE,ER_EXAM,ER_REQ,ER_GAD,
  33.          ER_LOC,ER_FONT,ER_ICON,ER_FILE,ER_MEM
  34. ENUM WBS=1,USER,LVID,RMB,WBSP
  35. ENUM ALWAYSOPENED=1,DOUBLECLICK,STARTUPSDIR,DEFSTARTUP,QUALIFIER,SCREENMODE,
  36.          DISABLEUSER,DISABLEWBS,LASTSTARTUP,FONT,FSIZE,EDITOR,LANGUAGE,SOUNDS
  37. ENUM MEN_ABOUT=1,MEN_PREFS,MEN_CLI,MEN_QUIT,MEN_NEWFILE,MEN_EHIGHSCRIPT,
  38.          MEN_DHIGHSCRIPT
  39. ENUM MSG_PROJECT=1,MSG_ABOUT,MSG_PREFS,MSG_CLI,MSG_QUIT,MSG_EDIT,MSG_DELETE,
  40.          MSG_NEWFILE,MSG_WBSTART,MSG_COMMANDS,MSG_USER,MSG_WBSTARTUP,MSG_REMEMBER,
  41.          MSG_ERWIN,MSG_ERDIR,MSG_ERNODIR,MSG_ERSCR,MSG_ERGAD,MSG_ERMEM,MSG_ERMOUSE,
  42.          MSG_NOFILE,MSG_NORENUSER,MSG_NORNENWBS,MSG_NOEXECUTE,MSG_CLOSEWIN,
  43.          MSG_ERLOC,MSG_HIGHSCRIPT,MSG_DELSCRIPT,MSG_YESNO,MSG_ERFONT,MSG_ERICON,
  44.          MSG_LOADSSP,MSG_ERROR
  45.  
  46. RAISE ER_WIN    IF OpenWindowTagList()=NIL,
  47.             ER_SCR    IF OpenScreenTagList()=NIL,
  48.             ER_MEM    IF New()=NIL
  49.  
  50. CONST BIGGER=-1,SMALLER=1
  51. CONST    WIDCMP=IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR IDCMP_MENUPICK OR LISTVIEWIDCMP
  52. CONST WFLAGS=WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_GIMMEZEROZERO+WFLG_NEWLOOKMENUS+WFLG_DEPTHGADGET
  53.  
  54. DEF ptrwin=NIL:PTR TO window,glist=NIL
  55. DEF scr=NIL:PTR TO screen,sig=-1,visual,menu
  56. DEF lv_width=NIL,lv_heigth=NIL,lv_gad,fic_nbr=0
  57. DEF dirlock=NIL
  58. DEF result,response,p_anchor:PTR TO anchorpath,olddir
  59. DEF ch[256]:STRING
  60. DEF node=NIL:PTR TO ln
  61. DEF wbsplus,wbsp_path
  62. DEF qual=NIL,rmbchoice=0
  63. DEF afp=NIL:PTR TO asciifp,fw=NIL:PTR TO freezewindows
  64. DEF tattr:PTR TO textattr,tfont:PTR TO textfont
  65. DEF rwidth=0,sound,out,cat
  66. DEF about=NIL,check=NIL,launched=NIL,opencli=NIL,prefer=NIL,exit=NIL,
  67.         welcome=NIL,delete=NIL,edit=NIL,confirm=NIL
  68. DEF audio=NIL:PTR TO audio,dirlist=NIL:PTR TO directorylist
  69. DEF nreq=NIL:PTR TO notifyrequest,notifysig
  70. DEF icons=NIL:PTR TO LONG,lvhook:hook,maxitemh
  71.  
  72. PROC main() HANDLE
  73.     DEF mes=NIL:PTR TO intuimessage
  74.     DEF id,gad=NIL:PTR TO gadget,i,userdata,idcmp,item
  75.     DEF seconds=0,micros,seconds2,micros2,sel
  76.     DEF prefs:PTR TO LONG
  77.     DEF selected
  78.     DEF sigwait,sig
  79.     initprefs()
  80.     IF afp.getkeyword(ALWAYSOPENED)=NO
  81.         IF peekqual() AND qual=NIL THEN Raise(ER_MOUSE)
  82.     ENDIF
  83.     init()
  84.     IF FindTask('Workbench')=NIL THEN initmonitor()
  85.     IF afp.getkeyword(SOUNDS)
  86.         loadsound()
  87.     ENDIF
  88.     screen()
  89.     wbsp_path:='SYS:prefs/WBStartup+Prefs'
  90.     wbsplusprefs()
  91.     scanstartupdir()
  92.     addstartgadget()
  93.     createmen()
  94.     window()
  95.     playsound(welcome)
  96.     sigwait:=NIL
  97.     sigwait:=Shl(1,ptrwin.userport.sigbit)
  98.     IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
  99.     REPEAT
  100.         sig:=Wait(sigwait)
  101.         IF sig AND Shl(1,notifysig)
  102.             Gt_ReplyIMsg(mes)
  103.             mes:=NIL
  104.             closewin()
  105.             scanstartupdir()
  106.             addstartgadget()
  107.             window(FALSE)
  108.             sigwait:=NIL
  109.             sigwait:=Shl(1,ptrwin.userport.sigbit)
  110.             IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
  111.         ELSEIF sig AND Shl(1,ptrwin.userport.sigbit)
  112.             IF mes:=Gt_GetIMsg(ptrwin.userport)
  113.                 idcmp:=mes.class
  114.                 Gt_GetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_SELECTED,{selected},NIL])
  115.                 SELECT idcmp
  116.                 CASE IDCMP_MENUPICK
  117.                     IF (item:=ItemAddress(menu,mes.code))<>NIL
  118.                         id:=Long(item+34)
  119.                         SELECT id
  120.                         CASE MEN_ABOUT
  121.                             playsound(about)
  122.                             req('StartupSelector\n\nVersion '+VERS+'\n\nCopyright © 1996-97\n\n'+
  123.                                     DATE+'\n\nJean-marc ''Moonchild'' OLIVERES\n&\n'+
  124.                                     'Raphaël ''RaphE'' GUENOT.','OK',gcs(MSG_ABOUT))
  125.                         CASE MEN_PREFS
  126.                             fw.freezewindow(ptrwin)
  127.                             playsound(prefer)
  128.                             prefs:=[afp.getkeyword(DISABLEUSER),
  129.                                             afp.getkeyword(DISABLEWBS)]
  130.                             SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
  131.                             fw.activatewindow(ptrwin)
  132.                             Gt_ReplyIMsg(mes)
  133.                             mes:=NIL
  134.                             IF reloadprefs()
  135.                                 sigwait:=NIL
  136.                                 sigwait:=Shl(1,ptrwin.userport.sigbit)
  137.                                 IF notifysig<>-1 THEN sigwait:=sigwait OR Shl(1,notifysig)
  138.                             ENDIF
  139.                             afp.setkeyword(DISABLEUSER,prefs[0])
  140.                             afp.setkeyword(DISABLEWBS,prefs[1])
  141.                         CASE MEN_CLI
  142.                             playsound(opencli)
  143.                             SystemTagList('NewCli',NIL)
  144.                         CASE MEN_QUIT
  145.                             playsound(exit,TRUE)
  146.                             Gt_ReplyIMsg(mes)
  147.                             out:=1
  148.                             quit()
  149.                         CASE MEN_NEWFILE
  150.                             playsound(edit)
  151.                             makepath(afp.getkeyword(EDITOR),'New_script')
  152.                             SystemTagList(ch,NIL)
  153.                         CASE MEN_EHIGHSCRIPT
  154.                             IF selected<>-1
  155.                                 playsound(edit)
  156.                                 makepath(afp.getkeyword(EDITOR),node.name)
  157.                                 SystemTagList(ch,NIL)
  158.                             ENDIF
  159.                         CASE MEN_DHIGHSCRIPT
  160.                             response:=0
  161.                             IF selected<>-1
  162.                                 playsound(delete)
  163.                                 response:=req(gcs(MSG_DELSCRIPT),gcs(MSG_YESNO),gcs(MSG_DELETE))
  164.                             ENDIF
  165.                             IF response=1
  166.                                 playsound(confirm)
  167.                                 makepath(NIL,node.name)
  168.                                 DeleteFile(ch)
  169.                                 Gt_SetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_LABELS,-1,NIL])
  170.                                 scanstartupdir()
  171.                                 Gt_SetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_LABELS,dirlist.dirlist,NIL])
  172.                                 Gt_SetGadgetAttrsA(lv_gad,ptrwin,NIL,[GTLV_SELECTED,-1,NIL])
  173.                             ENDIF
  174.                         ENDSELECT
  175.                     ENDIF
  176.                 CASE IDCMP_GADGETUP
  177.                     gad:=mes.iaddress
  178.                     userdata:=gad.userdata
  179.                     SELECT userdata
  180.                     CASE USER
  181.                         playsound(check)
  182.                         afp.setkeyword(DISABLEUSER,Not(afp.getkeyword(DISABLEUSER)))
  183.                     CASE WBS
  184.                         playsound(check)
  185.                         afp.setkeyword(DISABLEWBS,Not(afp.getkeyword(DISABLEWBS)))
  186.                     CASE RMB
  187.                         playsound(check)
  188.                         rmbchoice:=Not(rmbchoice)
  189.                     CASE WBSP
  190.                         playsound(launched)
  191.                         fw.freezewindow(ptrwin)
  192.                         SystemTagList(wbsp_path,NIL)
  193.                         fw.activatewindow(ptrwin)
  194.                     CASE LVID
  195.                         node:=dirlist.dirlist.head
  196.                         FOR i:=1 TO mes.code DO node:=node.succ 
  197.                         IF afp.getkeyword(DOUBLECLICK)
  198.                             CurrentTime({seconds2},{micros2})
  199.                             IF seconds=0
  200.                                 CurrentTime({seconds},{micros})
  201.                                 sel:=i
  202.                             ELSEIF DoubleClick(seconds,micros,seconds2,micros2) AND (sel=i)
  203.                                 afp.setkeyword(LASTSTARTUP,node.name)
  204.                                 Gt_ReplyIMsg(mes)
  205.                                 launchstart(node.name)
  206.                             ELSE
  207.                                 seconds:=0
  208.                                 CurrentTime({seconds},{micros})
  209.                                 sel:=i
  210.                             ENDIF
  211.                         ELSE
  212.                             afp.setkeyword(LASTSTARTUP,node.name)
  213.                             Gt_ReplyIMsg(mes)
  214.                             launchstart(node.name)
  215.                         ENDIF
  216.                     ENDSELECT
  217.                 ENDSELECT
  218.                 IF mes<>NIL THEN Gt_ReplyIMsg(mes)
  219.             ENDIF
  220.         ENDIF
  221.     UNTIL idcmp=IDCMP_CLOSEWINDOW
  222.     launchstart(afp.getkeyword(DEFSTARTUP))
  223. EXCEPT
  224.     SELECT exception
  225.         CASE ER_WIN        ;    req(gcs(MSG_ERWIN),'OK',gcs(MSG_ERROR))
  226.         CASE ER_DIR        ;    req(gcs(MSG_ERDIR),'OK',gcs(MSG_ERROR))
  227.         CASE ER_NODIR    ;    req(gcs(MSG_ERNODIR),'OK',gcs(MSG_ERROR))
  228.         CASE ER_SCR        ;    req(gcs(MSG_ERSCR),'OK',gcs(MSG_ERROR))
  229.         CASE ER_GAD        ; req(gcs(MSG_ERGAD),'OK',gcs(MSG_ERROR))
  230.         CASE ER_LOC        ; req(gcs(MSG_ERLOC),'OK',gcs(MSG_ERROR))
  231.         CASE ER_FONT    ; req(gcs(MSG_ERFONT),'OK',gcs(MSG_ERROR))
  232.         CASE ER_ICON    ; req(gcs(MSG_ERICON),'OK',gcs(MSG_ERROR))
  233.         CASE ER_MEM        ; req(gcs(MSG_ERMEM),'OK',gcs(MSG_ERROR))
  234.         CASE ER_MOUSE
  235.             sound:=1
  236.             IF rmbchoice
  237.                 launchstart(afp.getkeyword(DEFSTARTUP))
  238.             ELSE
  239.                 StrCopy(ch,afp.getkeyword(STARTUPSDIR),ALL)
  240.                 AddPart(ch,afp.getkeyword(DEFSTARTUP),70)
  241.                 IF (dirlock:=Lock(ch,ACCESS_READ))=NIL
  242.                     req(gcs(MSG_ERMOUSE),'OK',gcs(MSG_ERROR))
  243.                     SystemTagList({lwb},NIL)    
  244.                     quit()
  245.                 ENDIF
  246.             ENDIF
  247.             launchstart(afp.getkeyword(DEFSTARTUP,TRUE))
  248.     ENDSELECT
  249.     quit()
  250. ENDPROC
  251.  
  252. PROC init()
  253.     DEF task,coul:PTR TO LONG,j
  254.     AssignPath('LOCALE','SYS:LOCALE/')
  255.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise(ER_GAD)
  256.     IF (localebase:=OpenLibrary('locale.library',38))=NIL THEN Raise(ER_LOC)
  257.     IF (iconbase:=OpenLibrary('icon.library',37))=NIL THEN Raise(NIL)
  258.     NEW audio.new([RIGHT_1+LEFT_1,RIGHT_2+LEFT_2]:CHAR)
  259.     NEW fw.init()
  260.     NEW dirlist.new()
  261.     NEW nreq
  262.     notifysig:=AllocSignal(-1)
  263.     IF notifysig<>-1
  264.         task:=FindTask(0)
  265.         nreq.name:=afp.getkeyword(STARTUPSDIR)
  266.         nreq.flags:=NRF_SEND_SIGNAL
  267.         nreq.port:=task
  268.         nreq.signalnum:=notifysig
  269.     ENDIF
  270.     StartNotify(nreq)
  271.     cat:=OpenCatalogA(NIL,'StartupSelector.catalog',
  272.                                       [OC_LANGUAGE,afp.getkeyword(LANGUAGE),
  273.                                         NIL])
  274.     installhook(lvhook, {lvrender})
  275.     coul:={rgb}
  276.     FOR j:=1 TO 24
  277.         coul[]:=Shl(coul[],24)
  278.         coul[]++
  279.     ENDFOR
  280. ENDPROC
  281.  
  282. PROC initprefs()
  283.     DEF ls:PTR TO LONG,quals:PTR TO LONG
  284.     Rename({wbsold},{wbs})
  285.     Rename({wbsoldinfo},{wbsinfo})
  286.     Rename({userold},{user})
  287.     AssignPath('ENV','ENVARC:')
  288.     reqtoolsbase:=OpenLibrary('reqtools.library',37)
  289.     ls:= ['LEFTBUTTON','RIGHTBUTTON','MIDDLEBUTTON',
  290.                 'LEFTALT','RIGHTALT','LEFTSHIFT','RIGHTSHIFT',
  291.                 'LEFTCOMMAND','RIGHTCOMMAND','CONTROL']
  292.     NEW afp.new([
  293.                              ['Double click ?',                    DOUBLECLICK,VAL_YESNO,YES],
  294.                              ['Window always opened ?',    ALWAYSOPENED,VAL_YESNO,NO],
  295.                              ['Sounds ?',                                SOUNDS,VAL_YESNO,YES],
  296.                              ['Path to editor:',                EDITOR,VAL_STR,'hd1:misc/ced3.5'],
  297.                              ['Startups directory:',        STARTUPSDIR,VAL_STR,'S:Start/'],
  298.                              ['Default startup:',                DEFSTARTUP,VAL_STR,{startseq}],
  299.                              ['Language:',                            LANGUAGE,VAL_STR,'français'],
  300.                              ['Qualifier:',                            QUALIFIER,ls,0],
  301.                              ['Screen mode:',                        SCREENMODE,VAL_HEX,$29000],
  302.                              ['Font:',                                    FONT,VAL_STR,'topaz.font'],
  303.                              ['Font size:',                            FSIZE,VAL_DEC,8],
  304.                              ['Disable User-Startup ?',    DISABLEUSER,VAL_YESNO,NO],
  305.                              ['Disable WBStartup ?',        DISABLEWBS,VAL_YESNO,NO]
  306.                             ])
  307.     IF afp.load({usename}) THEN afp.load({prefsname})
  308.     quals:=[IEQUALIFIER_LEFTBUTTON,IEQUALIFIER_RBUTTON,IEQUALIFIER_MIDBUTTON,
  309.                     IEQUALIFIER_LALT,IEQUALIFIER_RALT,IEQUALIFIER_LCOMMAND,
  310.                     IEQUALIFIER_RCOMMAND,IEQUALIFIER_LSHIFT,IEQUALIFIER_RSHIFT,
  311.                     IEQUALIFIER_CONTROL]
  312.     qual:=quals[afp.getkeyword(QUALIFIER)]
  313. ENDPROC
  314.  
  315. PROC initmonitor()
  316.     DEF info:fileinfoblock
  317.     p_anchor:=New(SIZEOF anchorpath)
  318.     IF (dirlock:=Lock('DEVS:monitors/',ACCESS_READ))=NIL THEN Raise(ER_NODIR)
  319.     olddir:=CurrentDir(dirlock)
  320.     result:=MatchFirst('~(#?.info)',p_anchor)
  321.     WHILE result=0
  322.         info:=p_anchor.info
  323.         SystemTagList(info.filename,NIL)
  324.         result:=MatchNext(p_anchor)
  325.     ENDWHILE
  326.     MatchEnd(p_anchor)
  327.     CurrentDir(olddir)
  328.     UnLock(dirlock)
  329.     dirlock:=NIL
  330. ENDPROC
  331.  
  332. PROC req(msg,choice,title)
  333.     DEF s
  334.     IF ptrwin THEN fw.freezewindow(ptrwin)
  335.     IF reqtoolsbase
  336.         s:=RtEZRequestA(msg,choice,0,0,[RTEZ_FLAGS,EZREQF_CENTERTEXT,
  337.                                                                      RT_REQPOS,REQPOS_CENTERSCR,
  338.                                                                      RTEZ_REQTITLE,title,
  339.                                                                    NIL])
  340.     ELSE
  341.         s:=EasyRequestArgs(NIL,[20,0,title,msg,choice],0,NIL)
  342.     ENDIF
  343.     IF ptrwin THEN fw.activatewindow(ptrwin)
  344. ENDPROC s
  345.  
  346. PROC scanstartupdir()
  347.     DEF err,lenstr
  348.     DEF ln:PTR TO lvitem,j,icon:PTR TO diskobject,img:PTR TO image
  349.     REPEAT
  350.         err:=dirlist.dirlist(afp.getkeyword(STARTUPSDIR),DLF_NODIRS,'~(#?.info|#?.bak)')
  351.         IF err
  352.             StringF(ch,'\s\n\s',gcs(MSG_ERDIR),gcs(MSG_LOADSSP))
  353.             req(ch,'OK',gcs(MSG_ERROR))
  354.             SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
  355.             afp.load({usename})
  356.         ENDIF
  357.         IF Not(err)
  358.             IF (fic_nbr:=dirlist.total())=NIL
  359.                 nofile()
  360.             ENDIF
  361.         ENDIF
  362.     UNTIL (fic_nbr<>NIL) AND (err=NIL)
  363.     freeicons() -> test dans la PROC pour savoir si icons<>NIL
  364.     icons:=List(fic_nbr)
  365.     SetList(icons,fic_nbr)
  366.     ln:=dirlist.gotofirst()
  367.     maxitemh:=NIL
  368.     lv_width:=NIL
  369.     FOR j:=0 TO fic_nbr-1
  370.         StrCopy(ch,afp.getkeyword(STARTUPSDIR))
  371.         AddPart(ch,ln.name,256)
  372.         lenstr:=textlength(ln.name)+28
  373.         IF icon:=GetDiskObject(ch)
  374.             img:=icon.gadget.gadgetrender
  375.             icons[j]:=icon
  376.             IF (lenstr+img.width+2)>lv_width THEN lv_width:=lenstr+img.width+2
  377.             IF img.height>maxitemh THEN maxitemh:=img.height
  378.         ELSE
  379.             IF lenstr>lv_width THEN lv_width:=lenstr
  380.         ENDIF
  381.         ln.icon:=j
  382.         ln:=dirlist.getnext()
  383.     ENDFOR
  384.     lv_width:=lv_width+2
  385. ENDPROC fic_nbr
  386.  
  387. PROC nofile()
  388.     StringF(ch,'\s\n\s',gcs(MSG_NOFILE),gcs(MSG_LOADSSP))
  389.     req(ch,'OK',gcs(MSG_ERROR))
  390.     SystemTagList('SYS:Prefs/StartupSelectorPrefs',NIL)
  391.     afp.load({usename})
  392. ENDPROC
  393.  
  394. PROC reloadprefs()
  395.     DEF sdir,sm,font,tfont,reopengui=FALSE
  396.     sdir:=afp.getkeyword(STARTUPSDIR)
  397.     sm:=afp.getkeyword(SCREENMODE)
  398.     font:=afp.getkeyword(FONT)
  399.     tfont:=afp.getkeyword(FSIZE)
  400.     afp.load({usename})
  401.     IF (sm<>afp.getkeyword(SCREENMODE)) OR (StrCmp(afp.getkeyword(FONT),font)=NIL) OR (afp.getkeyword(FSIZE)<>tfont)
  402.         closegui()
  403.         screen()
  404.         reopengui:=-1
  405.     ENDIF
  406.     IF (StrCmp(sdir,afp.getkeyword(STARTUPSDIR))=NIL)
  407.         closewin()
  408.         reopengui:=-1
  409.     ENDIF
  410.     IF reopengui
  411.         scanstartupdir()
  412.         addstartgadget()
  413.         window()
  414.     ENDIF
  415. ENDPROC reopengui
  416.  
  417. PROC addstartgadget()
  418.     DEF gadget,wbsplen
  419.     DEF strs:PTR TO LONG,lenstr
  420.     rwidth:=0
  421.     strs:=[gcs(MSG_USER),
  422.                 gcs(MSG_WBSTARTUP),
  423.                 gcs(MSG_REMEMBER),
  424.                 gcs(MSG_WBSTART),NIL]
  425.     WHILE strs[]<>NIL DO IF (lenstr:=textlength(strs[]++))>rwidth THEN rwidth:=lenstr
  426.     rwidth:=rwidth+35
  427.     visual:=GetVisualInfoA(scr,NIL)
  428.     gadget:=CreateContext({glist})
  429.     wbsplen:=textlength(gcs(MSG_WBSTART))+8
  430.     IF tattr.ysize>maxitemh THEN maxitemh:=tattr.ysize
  431.     INC maxitemh
  432.     IF maxitemh AND 1 THEN INC maxitemh
  433.     IF fic_nbr<6
  434.         lv_heigth:=5*maxitemh+4
  435.     ELSEIF (fic_nbr*maxitemh+4)>(scr.height-(2*maxitemh))
  436.         lv_heigth:=Div(scr.height,maxitemh)*maxitemh+4-(2*maxitemh)
  437.     ELSE
  438.         lv_heigth:=fic_nbr*maxitemh+4
  439.     ENDIF
  440.     gadget:=CreateGadgetA(LISTVIEW_KIND,gadget,
  441.                     [0,0,lv_width,lv_heigth,0,tattr,0,0,visual,LVID]:newgadget,
  442.                     [    GTLV_LABELS,            dirlist.dirlist,
  443.                         GTLV_SELECTED,        dirlist.getpos(afp.getkeyword(DEFSTARTUP)),
  444.                         GTLV_ITEMHEIGHT,    maxitemh,
  445.                         GTLV_CALLBACK,        lvhook,
  446.                         GTLV_MAXPEN,            $FF,
  447.                         GTLV_SHOWSELECTED,NIL,NIL])
  448.     lv_gad:=gadget
  449.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  450.                     [lv_width+2,0,12,tattr.ysize+4,
  451.                     gcs(MSG_USER),tattr,
  452.                     0,PLACETEXT_RIGHT,visual,USER]:newgadget,
  453.                     [GTCB_CHECKED,afp.getkeyword(DISABLEUSER),NIL])
  454.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  455.           [lv_width+2,tattr.ysize+4,12,tattr.ysize+4,
  456.                     gcs(MSG_WBSTARTUP),tattr,
  457.                     0,PLACETEXT_RIGHT,visual,WBS]:newgadget,
  458.                     [GTCB_CHECKED,afp.getkeyword(DISABLEWBS),NIL])
  459.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  460.           [lv_width+2,tattr.ysize*2+8,12,tattr.ysize+4,
  461.                     gcs(MSG_REMEMBER),tattr,
  462.                     0,PLACETEXT_RIGHT,visual,RMB]:newgadget,
  463.                     [GTCB_CHECKED,rmbchoice,NIL])
  464.     IF wbsplus
  465.         gadget:=CreateGadgetA(BUTTON_KIND,gadget,
  466.                         [((rwidth-wbsplen)/2)+lv_width,lv_heigth-tattr.ysize-5,wbsplen,
  467.                         tattr.ysize+4,gcs(MSG_WBSTART),tattr,0,0,visual,WBSP]:newgadget,NIL)
  468.     ENDIF
  469. ENDPROC
  470.  
  471. PROC screen()
  472.     tattr:=[afp.getkeyword(FONT),afp.getkeyword(FSIZE),0,0]:textattr
  473.     IF (tfont:=OpenFont(tattr))=NIL
  474.         IF (diskfontbase:=OpenLibrary('diskfont.library',37))=NIL
  475.             req(gcs(MSG_ERFONT),'OK',gcs(MSG_ERROR))
  476.         ELSE
  477.             tfont:=OpenDiskFont(tattr)
  478.         ENDIF
  479.     ENDIF
  480.     IF tfont=NIL THEN tattr:=['topaz.font',8,0,0]:textattr
  481.     scr:=OpenScreenTagList(NIL,[SA_TITLE,            {ssscrntitle},
  482.                                                             SA_DEPTH,            3,
  483.                                                             SA_TYPE,            PUBLICSCREEN,
  484.                                                             SA_PUBNAME,        {pubname},
  485.                                                             SA_PUBSIG,        sig:=AllocSignal(-1),
  486.                                                             SA_PUBTASK,        FindTask(NIL),
  487.                                                             SA_PENS,            [-1],
  488.                                                             SA_FONT,            tattr,
  489.                                                             SA_DISPLAYID,    afp.getkeyword(SCREENMODE),
  490.                                                             SA_AUTOSCROLL,TRUE,
  491.                                                             SA_COLORS32,    {palette},
  492.                                                             NIL])
  493.     PubScreenStatus(scr,0)
  494.     SetDefaultPubScreen({pubname})
  495.     SetPubScreenModes(SHANGHAI)
  496. ENDPROC
  497.  
  498. PROC window(activate=TRUE)
  499.     DEF beveltags
  500.     DEF w_width,w_left,w_top
  501.     w_width:=lv_width+rwidth+8
  502.     w_left:=(scr.width-w_width)/2
  503.     w_top:=(scr.height-lv_heigth)/2
  504.     beveltags:=[GT_VISUALINFO,visual,GTBB_FRAMETYPE,BBFT_BUTTON,NIL]
  505.   LayoutMenusA(menu,visual,NIL)
  506.     ptrwin:=OpenWindowTagList(NIL,[WA_TITLE        ,{sstitle},
  507.                                  WA_GADGETS      ,glist,
  508.                                  WA_LEFT         ,w_left,
  509.                                  WA_TOP          ,w_top,
  510.                                  WA_INNERWIDTH   ,w_width,
  511.                                  WA_INNERHEIGHT  ,lv_heigth,
  512.                                  WA_IDCMP        ,WIDCMP,
  513.                                  WA_FLAGS        ,WFLAGS,
  514.                                  WA_CUSTOMSCREEN ,scr,
  515.                                                                  WA_AUTOADJUST   ,TRUE,
  516.                                  WA_ACTIVATE     ,activate,
  517.                                  NIL])
  518.   SetMenuStrip(ptrwin,menu)
  519.     Gt_RefreshWindow(ptrwin,NIL)
  520. ENDPROC
  521.  
  522. PROC createmen()
  523.     DEF fp
  524.     IF KickVersion(39) THEN fp:=1 ELSE fp:=0
  525.   menu:=CreateMenusA([1,0,gcs(MSG_PROJECT),0,0,0,0,
  526.                                             2,0,gcs(MSG_ABOUT),'?',0,0,MEN_ABOUT,
  527.                                             2,0,NM_BARLABEL,0,0,0,0,
  528.                       2,0,gcs(MSG_PREFS),'P',0,0,MEN_PREFS,
  529.                                             2,0,NM_BARLABEL,0,0,0,0,
  530.                                             2,0,gcs(MSG_CLI),'C',0,0,MEN_CLI,
  531.                                             2,0,NM_BARLABEL,0,0,0,0,
  532.                                             2,0,gcs(MSG_QUIT),'Q',0,0,MEN_QUIT,
  533.                                             1,0,gcs(MSG_COMMANDS),0,0,0,0,
  534.                                             2,0,gcs(MSG_EDIT),0,0,0,0,
  535.                                             3,0,gcs(MSG_NEWFILE),'E',0,0,MEN_NEWFILE,
  536.                                             3,0,NM_BARLABEL,0,0,0,0,
  537.                                             3,0,gcs(MSG_HIGHSCRIPT),'S',0,0,MEN_EHIGHSCRIPT,
  538.                                             2,0,NM_BARLABEL,0,0,0,0,
  539.                                             2,0,gcs(MSG_DELETE),'D',0,0,MEN_DHIGHSCRIPT,
  540.                       0,0,0,0,0,0,0]:newmenu,[GTMN_NEWLOOKMENUS,TRUE,
  541.                                                                       GTMN_FRONTPEN,        fp,
  542.                                                                                             NIL])
  543. ENDPROC
  544.  
  545. PROC lvrender(y,o:PTR TO lvitem,m:PTR TO lvdrawmsg)
  546.     DEF icon:PTR TO diskobject,img:PTR TO image,x,back=0
  547.     DEF r:PTR TO rastport
  548.     IF m.methodid=LV_DRAW
  549.         r:=m.rastport
  550.         SetStdRast(r)
  551.         icon:=icons[o.icon]
  552.         IF (m.state AND LVR_SELECTED) OR (m.state AND LVR_SELECTEDDISABLED)
  553.             back:=3
  554.             IF icon THEN img:=icon.gadget.selectrender
  555.         ELSE
  556.             IF icon
  557.                 IF (img:=icon.gadget.gadgetrender)=NIL THEN img:=icon.gadget.selectrender
  558.             ENDIF
  559.         ENDIF
  560.         Box(m.bounds.minx,m.bounds.miny,m.bounds.maxx,m.bounds.maxy,back)
  561.         Colour(1,back)
  562.         IF icon
  563.             x:=2
  564.             y:=Shr(maxitemh-img.height,1)+m.bounds.miny
  565.             DrawImage(m.rastport,img,x,y)
  566.             x:=img.width+4
  567.         ELSE
  568.             x:=4
  569.         ENDIF
  570.             y:=Shr(maxitemh-m.drawinfo.font.ysize,1)+m.bounds.miny+m.drawinfo.font.ysize-1
  571.             TextF(x,y,o.name)
  572.     ELSE
  573.         RETURN LVCB_UNKNOWN
  574.     ENDIF
  575. ENDPROC LVCB_OK
  576.  
  577. PROC launchstart(file)
  578.     DEF launch
  579.     IF sound=1
  580.         END audio
  581.     ELSE
  582.         playsound(launched,TRUE)
  583.     ENDIF
  584.     IF afp.getkeyword(DISABLEUSER)
  585.         IF (Rename({user},{userold}))=NIL
  586.             req(gcs(MSG_NORENUSER),'OK',gcs(MSG_ERROR))
  587.             RETURN
  588.         ENDIF
  589.     ENDIF
  590.     IF afp.getkeyword(DISABLEWBS)
  591.         IF (Rename({wbs},{wbsold}))=NIL OR (Rename({wbsinfo},{wbsoldinfo}))=NIL
  592.             req(gcs(MSG_NORNENWBS),'OK',gcs(MSG_ERROR))
  593.         ENDIF
  594.     ENDIF
  595.     makepath('C:EXECUTE ',file)    
  596.     closegui()
  597.     IF (launch:=SystemTagList(ch,NIL))=TRUE
  598.         req(gcs(MSG_NOEXECUTE),'OK',gcs(MSG_ERROR))
  599.     ENDIF
  600.     quit()
  601. ENDPROC
  602.  
  603. PROC wbsplusprefs()
  604.     IF dirlock:=Lock(wbsp_path,ACCESS_READ)
  605.         wbsplus:=TRUE
  606.         UnLock(dirlock)
  607.         dirlock:=NIL
  608.     ENDIF    
  609. ENDPROC
  610.  
  611. PROC quit()
  612.     closegui()
  613.     IF cat THEN CloseCatalog(cat)
  614.     IF menu THEN FreeMenus(menu)
  615.     IF dirlock THEN UnLock(dirlock)
  616.     IF localebase THEN CloseLibrary(localebase)
  617.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  618.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  619.     IF iconbase THEN CloseLibrary(iconbase)
  620.     IF out<>1
  621.         IF rmbchoice
  622.             afp.setkeyword(DEFSTARTUP,node.name)
  623.             afp.save()
  624.         ENDIF
  625.     ENDIF
  626.     IF afp THEN END afp
  627.     IF fw THEN END fw
  628.     END audio
  629.     IF nreq
  630.         EndNotify(nreq)
  631.         FreeSignal(notifysig)
  632.         END nreq
  633.     ENDIF
  634.     DeleteFile({usename})
  635.     freesample(about)
  636.     freesample(check)
  637.     freesample(launched)
  638.     freesample(opencli)
  639.     freesample(prefer)
  640.     freesample(exit)
  641.     freesample(welcome)
  642.     freesample(delete)
  643.     freesample(edit)
  644.     freesample(confirm)
  645.     CleanUp(0)
  646. ENDPROC
  647.  
  648. PROC freeicons()
  649.     DEF j
  650.     IF icons
  651.         FOR j:=0 TO ListLen(icons)-1
  652.             IF icons[j] THEN FreeDiskObject(icons[j])
  653.         ENDFOR
  654.         DisposeLink(icons)
  655.     ENDIF
  656. ENDPROC
  657.  
  658. PROC closegui()
  659.     closewin()
  660.     IF scr
  661.         IF countvisitorwindows({pubname})>0
  662.             req(gcs(MSG_CLOSEWIN),'OK',gcs(MSG_QUIT))
  663.             REPEAT            
  664.                 Wait(Shl(1,sig))
  665.             UNTIL countvisitorwindows({pubname})=0
  666.         ENDIF
  667.         SetDefaultPubScreen(NIL)
  668.         CloseS(scr)
  669.         scr:=NIL
  670.     ENDIF
  671.     IF tfont
  672.         IF diskfontbase
  673.             CloseFont(tfont)
  674.             CloseLibrary(diskfontbase)
  675.         ELSE
  676.             CloseFont(tfont)
  677.         ENDIF
  678.     ENDIF
  679.     IF sig>=0
  680.         FreeSignal(sig)
  681.         sig:=0
  682.     ENDIF
  683. ENDPROC
  684.  
  685. PROC closewin()
  686.     IF ptrwin
  687.         ClearMenuStrip(ptrwin)
  688.         CloseW(ptrwin)
  689.         ptrwin:=NIL
  690.         IF glist THEN FreeGadgets(glist)
  691.         IF visual THEN FreeVisualInfo(visual)
  692.         visual:=NIL
  693.         glist:=NIL
  694.     ENDIF
  695. ENDPROC
  696.  
  697. PROC countvisitorwindows(scrname:PTR TO CHAR)
  698.     DEF list:PTR TO lh,node:PTR TO pubscreennode,count
  699.     list:=LockPubScreenList()
  700.     node:=FindName(list,scrname)
  701.     IF scr=NIL
  702.         count:=-1
  703.     ELSE
  704.         count:=node.visitorcount
  705.     ENDIF
  706.     UnlockPubScreenList()
  707. ENDPROC count
  708.  
  709. PROC textlength(text)
  710. ENDPROC IntuiTextLength([0,0,0,0,0,tattr,text,NIL]:intuitext)
  711.  
  712. PROC loadsound()
  713.      about:=load8svx('PROGDIR:sounds/about')
  714.      check:=load8svx('PROGDIR:sounds/check')
  715.     exit:=load8svx('PROGDIR:sounds/quit')
  716.      launched:=load8svx('PROGDIR:sounds/launched')
  717.      opencli:=load8svx('PROGDIR:sounds/opencli')
  718.      prefer:=load8svx('PROGDIR:sounds/preferences')
  719.      welcome:=load8svx('PROGDIR:sounds/welcome')
  720.     edit:=load8svx('PROGDIR:sounds/edit')
  721.     delete:=load8svx('PROGDIR:sounds/delete')
  722.     confirm:=load8svx('PROGDIR:sounds/confirm')
  723. ENDPROC
  724.  
  725. PROC playsound(sample,wait=FALSE)
  726.     IF (sample)
  727.         audio.play(sample)
  728.         IF wait THEN audio.waitendsample()
  729.     ENDIF
  730. ENDPROC
  731.  
  732. PROC makepath(begin,end)
  733.     DEF ch2[108]:STRING
  734.     IF begin<>NIL
  735.         StrCopy(ch2,begin,ALL)
  736.         StrCopy(ch,afp.getkeyword(STARTUPSDIR),ALL)
  737.         AddPart(ch,end,70)
  738.         StringF(ch,'"\s"',ch)
  739.         StrAdd(ch2,' ',ALL)
  740.         StrAdd(ch2,ch,ALL)
  741.         StrCopy(ch,ch2,ALL)
  742.     ELSE
  743.         StrCopy(ch,afp.getkeyword(STARTUPSDIR),ALL)
  744.         AddPart(ch,end,70)
  745.     ENDIF
  746. ENDPROC ch
  747.  
  748. PROC gcs(msg)
  749. ENDPROC GetCatalogStr(cat,msg,
  750.                         ListItem(['Project','About','Preferences','NewCli','Quit',
  751.                                             'Edit','Delete','New file','Call WBStartup+',
  752.                                             'Commands','Disable User-Startup','Disable WBStartup',
  753.                                             'Remember choices','Unable to open window !',
  754.                                             'Can''t find your directory !','Not a directory !',
  755.                                             'Unable to lock Workbench screen !',
  756.                                             'Can''t open the Gadtools.library !',
  757.                                             'Not enough memory !',
  758.                                             'No Startup-Sequence !',
  759.                                             'No script in the directory !',
  760.                                             'Can''t rename User-Startup !',
  761.                                             'Can''t rename WBStartup or WBStartup.info !',
  762.                                             'Can''t execute this script !',
  763.                                             'Please close the\nwindows to continue',
  764.                                             'Can''t open Locale.library !',
  765.                                             'Selected script ?',
  766.                                             'Do you really want to delete\nthe selected script ?',
  767.                                             'YES|NO','Can''t open Diskfont.library !',
  768.                                             'Can''t open Icon.library !',
  769.                                             'Loading StartupSelectorPrefs',
  770.                                             'Error !'],msg-1))
  771.  
  772. palette:
  773. INT    8,0    -> 8 couleurs à charger en commançant par la couleur 0
  774. rgb:
  775. LONG    149,149,149,    0,0,0,    255,255,255,    59,103,162,    123,123,123,
  776.             175,175,175,    170,144,124,    255,169,151
  777. LONG 0    -> fin de la liste
  778.  
  779. wbs:                    CHAR 'SYS:WBStartup',0
  780. wbsinfo:            CHAR 'SYS:WBStartup.info',0
  781. wbsold:                CHAR 'SYS:WBStartupOld',0
  782. wbsoldinfo:        CHAR 'SYS:WBStartupOld.info',0
  783. user:                    CHAR 'S:User-Startup',0
  784. userold:            CHAR 'S:User-StartupOld',0
  785. lwb:                    CHAR 'C:LoadWB',0
  786. sstitle:            CHAR 'StartupSelector ',VERS,0
  787. ssscrntitle:    CHAR 'StartupSelector ',VERS,' Copyright © 1996-97 Moonchild Prod.',0
  788. startseq:            CHAR 'Startup-Sequence',0
  789. pubname:            CHAR 'StartupSelector',0
  790. prefsname:        CHAR 'S:startupselector.prefs',0
  791. usename:            CHAR 'RAM:startupselector.prefs',0
  792.  
  793. CHAR '$VER: StartupSelector ',VERS,' (',DATE,') Moonchild Prod.',0
  794.